package com.studyhub.message.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.studyhub.api.message.entity.NoticeMessageEntity;
import com.studyhub.api.message.vo.NoticeMessagePage;
import com.studyhub.api.message.vo.NoticeMessageQueryVO;
import com.studyhub.api.message.vo.NoticeMessageStatsVO;

import java.util.List;

/**
 * @Description 通知消息Service接口
 * @Author YWF
 * @Version 1.0.0
 * @Date 2025/9/26 10:50
 */
public interface INoticeMessageService extends IService<NoticeMessageEntity> {
    
    /**
     * 分页查询通知消息
     *
     * @param queryVO 查询条件
     * @param userId 用户ID
     * @return 分页结果
     */
    IPage<NoticeMessagePage> pageNoticeMessages(NoticeMessageQueryVO queryVO, Long userId);
    
    /**
     * 获取用户的通知消息统计信息
     *
     * @param userId 用户ID
     * @return 统计信息
     */
    NoticeMessageStatsVO getNoticeMessageStats(Long userId);
    
    /**
     * 发送通知消息
     *
     * @param message 消息实体
     * @return 是否发送成功
     */
    boolean sendNoticeMessage(NoticeMessageEntity message);
    
    /**
     * 批量发送通知消息
     *
     * @param messages 消息列表
     * @return 发送成功的数量
     */
    int batchSendNoticeMessages(List<NoticeMessageEntity> messages);
    
    /**
     * 标记消息为已读
     *
     * @param messageId 消息ID
     * @param userId 用户ID
     * @return 是否标记成功
     */
    boolean markAsRead(Long messageId, Long userId);
    
    /**
     * 批量标记消息为已读
     *
     * @param messageIds 消息ID列表
     * @param userId 用户ID
     * @return 标记成功的数量
     */
    int batchMarkAsRead(List<Long> messageIds, Long userId);
    
    /**
     * 标记所有未读消息为已读
     *
     * @param userId 用户ID
     * @return 标记成功的数量
     */
    int markAllAsRead(Long userId);
    
    /**
     * 删除消息
     *
     * @param messageIds 消息ID列表
     * @param userId 用户ID
     * @return 删除成功的数量
     */
    int deleteMessages(List<Long> messageIds, Long userId);
    
    /**
     * 获取未读消息数量
     *
     * @param userId 用户ID
     * @return 未读消息数量
     */
    long getUnreadCount(Long userId);
}